package com.fram.common.util.area;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import com.fram.common.canstant.ErrCode;
import com.fram.common.canstant.PublicConstant;
import com.fram.common.exception.ProException;
import com.fram.common.exception.ProValiDataException;
import com.fram.common.util.PublicMethod;
import com.fram.common.util.area.bean.baidu.AddressCode;
import com.fram.common.util.area.bean.baidu.LngLatToAddress;
import com.fram.common.util.http.HttpClientTools;
import com.fram.common.util.json.JSONTools;

/**
 * @作者： 陳曉鬆 @时间： 2020年6月12日 - 下午4:16:36 @description：->
 */
public class AreaUtils {

	private static Logger LOG = LoggerFactory.getLogger(AreaUtils.class);

	/**
	 * 
	 * @description：-> 根据经纬度得到地址信息
	 * 
	 * @param lng
	 * @param lat
	 * @return
	 *
	 * @作者：丶CHEN、 @时间：2018年7月3日 下午4:09:02、@版本：V1.0
	 */
	public static LngLatToAddress baidugeocoder(String lng, String lat) throws ProException {
		// http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad
		// pois 是否召回传入坐标周边的poi，0为不召回，1为召回。当值为1时，默认显示周边1000米内的poi。
		LngLatToAddress lngLatToAddress = new LngLatToAddress();
		// String url = "http://api.map.baidu.com/geocoder/v2/?ak=%s&location=%s,%s&output=json&pois=0&language_auto=1&latest_admin=1&language=zh-CN";
		String url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak=%s&output=json&coordtype=wgs84ll&location=%s,%s";
		url = String.format(url, PublicConstant.BAIDU_AK, lat, lng);
		String result = null;
		try {
			result = HttpClientTools.get(url, null, null);
			if (!StringUtils.isEmpty(result)) {
				lngLatToAddress = JSONTools.jsonStr2obj(result, LngLatToAddress.class);
			} else {
				throw new ProValiDataException(ErrCode.NO_DATA.getReturnCode(), ErrCode.NO_DATA.getReturnMsg());
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new ProValiDataException(ErrCode.ERR.getReturnCode(), ErrCode.ERR.getReturnMsg());
		}
		return lngLatToAddress;
	}

	/**
	 * 百度-坐标转换
	 * 
	 * @param longitude
	 *            经度
	 * @param latitude
	 *            纬度
	 * @param from
	 *            源坐标类型 1：GPS设备获取的角度坐标，WGS84坐标; 2：GPS获取的米制坐标、sogou地图所用坐标; 3：google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标，国测局（GCJ02）坐标; 4：3中列表地图坐标对应的米制坐标; 5：百度地图采用的经纬度坐标; 6：百度地图采用的米制坐标; 7：mapbar地图坐标;
	 *            8：51地图坐标
	 * @param to
	 *            目标坐标类型： 3：国测局（GCJ02）坐标; 4：3中对应的米制坐标; 5：bd09ll(百度经纬度坐标); 6：bd09mc(百度米制经纬度坐标)
	 * @return
	 */
	public static String baiduGeoConv(String longitude, String latitude, Integer from, Integer to) {
		String url = "http://api.map.baidu.com/geoconv/v1/?coords=%s,%s&from=%s&to=%s&ak=%s&output=xml";
		url = String.format(url, longitude, latitude, from, to, PublicConstant.BAIDU_AK);
		String result = null;
		try {
			result = HttpClientTools.get(url, null, null);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * @作者：陳曉鬆 @时间：2020年6月15日 上午9:14:24 @版本：V1.0 @description：-> 搜索
	 */
	public static String baiduGeoSearch(String region, String key) {
		String url = "http://api.map.baidu.com/place_abroad/v1/search?query=%s&page_size=10&page_num=0&scope=1&region=%s&output=json&ak=%s";
		url = String.format(url, key, region, PublicConstant.BAIDU_AK);
		String result = null;
		try {
			result = HttpClientTools.get(url, null, null);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * @作者：陳曉鬆 @时间：2020年6月15日 上午9:19:36 @版本：V1.0 @description：->
	 */
	public static AddressCode getCityCode(String lng, String lat) {
		AddressCode addressCode = new AddressCode();
		LngLatToAddress result = null;
		try {
			result = baidugeocoder(lng, lat);
		} catch (Exception e) {
			LOG.error("-百度坐标操作->{},{},{},{}", lng, lat, PublicMethod.printErrorTrace(e));
			return addressCode;
		}
		if (result == null || result.getStatus() != 0 || result.getResult() == null || result.getResult().getAddressComponent() == null) {
			LOG.error("-百度坐标操作->{},{},{}", lng, lat, JSONTools.obj2json(result));
			return addressCode;
		}
		String cityCode = result.getResult().getAddressComponent().getAdcode();
		if (cityCode == null || cityCode.length() < 6) {
			LOG.error("-百度坐标操作-cityCode不对->{},{},{},{}", lng, lat, cityCode, JSONTools.obj2json(result));
			return addressCode;
		}
		addressCode.setAreaCode(cityCode);
		addressCode.setCityCode(cityCode.substring(0, 4) + "00");
		addressCode.setProvinceCode(cityCode.substring(0, 3) + "000");
		return addressCode;
	}

}
